#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Project Environment Variables Loader Tool

这个工具用于加载项目环境变量配置。当设置了PROJECT_ENV_CONFIG环境变量时，
会执行对应的shell脚本并将输出的环境变量加载到构建环境中。
"""

import os
import subprocess
import sys
import logging
from typing import Dict, Optional

def generate(env):
    """
    SCons工具生成函数
    
    Args:
        env: SCons环境对象
    """
    # 添加项目环境变量加载功能到SCons环境
    env.AddMethod(load_project_env_config, "LoadProjectEnvConfig")
    
    # 自动加载项目环境变量配置
    load_project_env_config(env)

def exists(env):
    """
    检查工具是否可用
    
    Args:
        env: SCons环境对象
        
    Returns:
        bool: 总是返回True，因为这个工具不依赖外部程序
    """
    return True

def load_project_env_config(env):
    """
    加载项目环境变量配置
    
    当设置了PROJECT_ENV_CONFIG环境变量时，执行对应的shell脚本
    并将环境变量加载到当前进程环境中。
    
    Args:
        env: SCons环境对象
    """
    project_env_config = os.environ.get('PROJECT_ENV_CONFIG')
    
    if not project_env_config:
        return
    
    if not os.path.exists(project_env_config):
        logging.warning(f"项目环境变量配置脚本不存在: {project_env_config}")
        return
    
    try:
        logging.info(f"正在执行项目环境变量配置脚本: {project_env_config}")
        
        # 构建执行脚本的命令，使其输出所有环境变量
        # 先source脚本，然后输出所有环境变量
        cmd = f"source {project_env_config} && env"
        
        # 执行脚本并获取环境变量，使用bash确保source命令可用
        result = subprocess.run(
            cmd,
            shell=True,
            executable='/bin/bash',  # 明确使用bash
            capture_output=True,
            text=True,
            env=os.environ.copy()  # 继承当前环境变量
        )
        
        if result.returncode != 0:
            logging.error(f"执行项目环境变量配置脚本失败: {result.stderr}")
            return
        
        # 解析输出的环境变量
        current_env = os.environ.copy()
        loaded_vars = []
        
        for line in result.stdout.split('\n'):
            line = line.strip()
            if '=' in line:
                var_name, var_value = line.split('=', 1)
                # 只处理新增或修改的环境变量
                if var_name not in current_env or current_env[var_name] != var_value:
                    # 设置到当前进程环境
                    os.environ[var_name] = var_value
                    loaded_vars.append((var_name, var_value))
        
        logging.info(f"成功执行项目环境变量配置脚本")
        
        if loaded_vars:
            logging.info(f"成功加载/更新 {len(loaded_vars)} 个环境变量:")
            for var_name, var_value in loaded_vars:
                # 只显示关键的环境变量，避免输出过多信息
                if any(key in var_name for key in ['PROTOC', 'BUILD_PROJECT_ROOT', 'PATH']):
                    logging.info(f"  {var_name}={var_value}")
        else:
            logging.info("脚本执行后未发现新的环境变量")
            
    except Exception as e:
        logging.error(f"执行项目环境变量配置脚本时发生错误: {e}")

# 注意：PROJECT_ENV_CONFIG功能说明
# 该功能用于加载项目环境变量配置脚本，解析其中的export语句
# 并将环境变量设置到当前进程环境中，不涉及SCons环境或编译器定义

if __name__ == "__main__":
    # 测试脚本
    logging.info("测试项目环境变量加载功能...")
    
    # 模拟SCons环境
    class MockEnv:
        def __init__(self):
            self.data = {'ENV': {}}
            
        def __getitem__(self, key):
            return self.data[key]
            
        def __setitem__(self, key, value):
            self.data[key] = value
    
    env = MockEnv()
    load_project_env_config(env)
    
    logging.info("测试完成")